package sys

import (
	"ginweb-admin/commons/base/api"
	"ginweb-admin/commons/response"
	"ginweb-admin/model/context"
	"ginweb-admin/model/entity/sys"
	"ginweb-admin/utils"
	"github.com/gin-gonic/gin"
	"strings"
)

type SysMenuApi struct {
	api.BaseApi
}

// 创建菜单
func (api *SysMenuApi) SaveData(c *gin.Context) {
	// 1: 第一件事情就准备数据的载体
	var sysMenu sys.SysMenu
	err := c.ShouldBindJSON(&sysMenu)
	if err != nil {
		// 如果参数注入失败或者出错就返回接口调用这。出错了.
		response.FailWithMessage(err.Error(), c)
		return
	}
	// 创建实例，保存帖子
	data, err := sysMenuService.Create(&sysMenu)
	// 如果保存失败。就返回创建失败的提升
	if err != nil {
		response.FailWithMessage("创建失败", c)
		return
	}
	// 如果保存成功，就返回创建创建成功
	response.OkMsgData("创建成功", data, c)
}

// 查询菜单列表
func (api *SysMenuApi) FindList(c *gin.Context) {
	// 获取参数
	keyword := c.Query("keyword")

	// 调用查询方法
	sysMenus, err := sysMenuService.FindList(keyword)
	if err != nil {
		response.FailWithMessage("查询失败！", c)
		return
	}
	response.Ok(sysMenuService.Tree(sysMenus, 0), c)
}

// 修改数据
func (api *SysMenuApi) UpdateData(c *gin.Context) {
	// 获取用户传递的参数
	var sysMenu sys.SysMenu
	// 绑定参数
	err := c.ShouldBindJSON(&sysMenu)
	if err != nil {
		response.FailWithError(err, c)
		return
	}
	// 结构体转化成map呢？
	// m := structs.Map(sysUser)
	// 继承的结构体无法转换，要么手动添加，要么不使用继承
	// m["is_deleted"] = sysUser.IsDeleted

	// 嵌套结构体转map
	m := utils.StructToMap(sysMenu)
	// 调用更新的方法
	err = sysMenuService.UpdateData(&sysMenu, &m)
	if err != nil {
		response.FailWithMessage("更新失败！", c)
		return
	}
	response.OkMessage("更新成功！", c)
}

// 修改状态
func (api *SysMenuApi) UpdateStatus(c *gin.Context) {
	// 获取请求的参数
	status := context.StatusContext{}

	// 绑定参数
	err := c.ShouldBindJSON(&status)
	if err != nil {
		response.FailWithError(err, c)
		return
	}

	// 调用修改的方法
	err = sysMenuService.UpdateStatus(status)
	if err != nil {
		response.FailWithMessage("状态更新失败！", c)
		return
	}
	response.OkMessage("状态更新成功！", c)
}

// 根据ID删除（真实删除）
func (api *SysMenuApi) DeleteById(c *gin.Context) {
	// 获取删除的id
	id := c.Param("id")

	// 调用删除的方法
	err := sysMenuService.UnDeleteById(api.StringToUnit(id))
	if err != nil {
		response.FailWithMessage("删除失败！", c)
		return
	}
	response.OkMessage("删除成功！", c)
}

// 批量删除系统用户信息
func (api *SysMenuApi) DeleteIds(c *gin.Context) {
	// 获取用户删除的ids  例如：ids = 1,2,3
	ids := c.Query("ids")
	// 根据，拆分 获取到具体的id
	idStrings := strings.Split(ids, ",")

	// 定义存储id数据的容器
	var sysMenus []*sys.SysMenu
	for _, id := range idStrings {
		// 定义存放每条id数据的容器
		sysMenu := sys.SysMenu{}
		// 字符串转换成数字类型
		sysMenu.ID = api.StringToUnit(id)
		// 把每条id的数据存放到切片类型的容器中
		sysMenus = append(sysMenus, &sysMenu)
	}

	// 调用删除方法
	err := sysMenuService.UnDeleteByIds(sysMenus)
	if err != nil {
		response.FailWithMessage("批量删除失败！", c)
		return
	}
	response.OkMessage("批量删除成功！", c)
}

// 查询父菜单
func (api *SysMenuApi) FindMenuRoot(c *gin.Context) {
	sysMenus, err := sysMenuService.FindMenuRoot()
	if err != nil {
		response.FailWithMessage("查询父菜单失败！", c)
		return
	}
	response.Ok(sysMenus, c)
}

// 根据ID查询
func (api *SysMenuApi) GetById(c *gin.Context) {
	// 获取参数
	id := c.Param("id")
	// 调用查询的方法
	sysMenu, err := sysMenuService.UnGetById(api.StringToUnit(id))
	if err != nil {
		response.FailWithMessage("查询失败！", c)
		return
	}
	response.Ok(sysMenu, c)
}

// 复制数据
func (api *SysMenuApi) CopyData(c *gin.Context) {
	// 获取传递的参数id
	id := c.Param("id")
	// 调用复制的方法
	data, err := sysMenuService.CopyData(api.StringToUnit(id))
	if err != nil {
		response.FailWithMessage("复制失败！", c)
		return
	}
	response.Ok(data, c)
}
